const math = require('./math')
/* eslint-disable */
function QRPolynomial(num, shift) {
  if (num.length == undefined) {
    throw new Error(num.length + '/' + shift)
  }

  let offset = 0

  while (offset < num.length && num[offset] == 0) {
    offset++
  }

  this.num = new Array(num.length - offset + shift)
  for (let i = 0; i < num.length - offset; i++) {
    this.num[i] = num[i + offset]
  }
}

QRPolynomial.prototype = {

  get(index) {
    return this.num[index]
  },

  getLength() {
    return this.num.length
  },

  multiply(e) {
    const num = new Array(this.getLength() + e.getLength() - 1)

    for (let i = 0; i < this.getLength(); i++) {
      for (let j = 0; j < e.getLength(); j++) {
        num[i + j] ^= math.gexp(math.glog(this.get(i)) + math.glog(e.get(j)))
      }
    }

    return new QRPolynomial(num, 0)
  },

  mod(e) {
    if (this.getLength() - e.getLength() < 0) {
      return this
    }

    const ratio = math.glog(this.get(0)) - math.glog(e.get(0))

    const num = new Array(this.getLength())

    for (var i = 0; i < this.getLength(); i++) {
      num[i] = this.get(i)
    }

    for (var i = 0; i < e.getLength(); i++) {
      num[i] ^= math.gexp(math.glog(e.get(i)) + ratio)
    }

    // recursive call
    return new QRPolynomial(num, 0).mod(e)
  }
}

module.exports = QRPolynomial
